package Moteur;

import Commande.Command;
import Common.Horloge;
import Common.HorlogeImpl;
import IHM.Afficheur;
import IHM.AfficheurImpl;

public class Controler implements Observer{

	MoteurMetronome moteur;
	Afficheur afficheur;
	Horloge horloge;

	public Controler(MoteurMetronome moteur) {
		this.moteur = moteur;
		afficheur = new AfficheurImpl();
		horloge = new HorlogeImpl();
	}

	/**
	 * Permet de demarrer le metronome
	 */
	public void start() {
		if(!moteur.getEtatMarche()){
			moteur.setEtatMarche(true);
			moteur.notifyObserver();
			afficheur.setEnableIncDec(false);
		}
	}

	/**
	 * Permet d arreter le metronome
	 */
	public void stop() {
		if(moteur.getEtatMarche()){
			moteur.setEtatMarche(false);
			moteur.notifyObserver();
			afficheur.setEnableIncDec(true);
		}
	}

	/**
	 * Permet de marquer un temps
	 */
	public void marquerTemps() {
		afficheur.allumerLED(1);
		horloge.activerApresDelai(new Command() {

			@Override
			public void execute() {
				afficheur.eteindreLED(1);
			}
		}, 100);

	}

	public Afficheur getAfficheur() {
		return afficheur;
	}


	/**
	 * Permet de marquer une mesure
	 */
	public void marquerMesure() {
		afficheur.allumerLED(0);
		horloge.activerApresDelai(new Command() {

			@Override
			public void execute() {
				afficheur.eteindreLED(0);
			}
		}, 100);
	}

	public void decrease() {
		moteur.decrease();
	}

	public void increase() {
		moteur.increase();	
	}

	/**
	 * Calcule du tempo
	 */
	@Override
	public void updateMolette(Integer valeur) {
		float position = afficheur.getMolette().getValue();
		float positionTemp = (position/100);
		float tempo = 40+(120-40)*positionTemp;
		int tempoTemp = (int) tempo;
		moteur.setTempo(tempoTemp);
	}

	/**
	 * update de la valeur du tempo
	 */
	@Override
	public void updateTempo(Integer valeur) {
		int tempo = (int) moteur.getTempo();
		afficheur.afficherTempo(tempo);
		stop();
		start();
	}

	/**
	 * Quand le tempo est mise a jour on teste la valeur du moteur et en fonction
	 * de celui ci on lance les bips du metronome ou on les arrete
	 */
	@Override
	public void update() {
		if(moteur.getEtatMarche()){			
			long periode  = (long) (60000/Float.parseFloat(moteur.getTempo()+""));
			horloge.activerPeriodiquement(moteur.getCommandeMarquerTemps(), periode);
			long delaiEnSecondes = (long) (60000/Float.parseFloat(moteur.getTempo()+""))*moteur.getNbTempsParMesure();
			horloge.activerPeriodiquement(moteur.getCommandeMarquerMesure(), delaiEnSecondes);
		}else{
			horloge.desactiver(moteur.getCommandeMarquerTemps());
			horloge.desactiver(moteur.getCommandeMarquerMesure());
		} 
	}
}
